package top.scauwlt.remoting.constants;

/**
 * @Author wmm
 * @Date 2022/7/25 22:51
 */
public class RpcConstants {
    /**
     * 传输协议设计
     * MAGIC_CODE：魔数，用于快速识别是否合规的包
     * VERSION：协议版本号，用于协议升级
     * HEAD_LENGTH：消息头长度：魔数 4 + 协议版本 1 + 消息总长度 4 + 消息类型 1 + 序列化类型 1 + 压缩类型 1 + 请求ID 4
     * 以下四个为 消息类型
     * REQUEST_TYPE：请求类型
     * RESPONSE_TYPE：响应类型
     * HEARTBEAT_REQUEST_TYPE：PING
     * HEARTBEAT_RESPONSE_TYPE：PONG
     */
    public static final byte[] MAGIC_CODE = new byte[]{(byte) 's', (byte) 'c', (byte) 'a', (byte) 'u'};
    public static final byte VERSION = 1;
    public static final int HEAD_LENGTH = 16;
    public static final byte REQUEST_TYPE = 1;
    public static final byte RESPONSE_TYPE = 2;
    public static final byte HEARTBEAT_REQUEST_TYPE = 3;
    public static final byte HEARTBEAT_RESPONSE_TYPE = 4;

    /**
     * LengthFieldBasedFrameDecoder 的各个参数
     * MAX_FRAME_LENGTH： 消息最大长度
     * LENGTH_FIELD_OFFSET：消息长度偏移值，消息长度在消息第 5 个字节处开始
     * LENGTH_FILED_LENGTH：消息长度所占字节，INT类型4个字节
     * LENGTH_ADJUSTMENT：消息截取调整，-9代表跳过最开始的 （4 + 1 +4）个字节
     * INITIAL_BYTES_TO_STRIP：需要跳过截取的消息长度，默认为0，从第9个开始全都获取到
     */
    public static final int MAX_FRAME_LENGTH = 8 * 1024 * 1024;
    public static final int LENGTH_FIELD_OFFSET = 5;
    public static final int LENGTH_FILED_LENGTH = 4;
    public static final int LENGTH_ADJUSTMENT = -9;
    public static final int INITIAL_BYTES_TO_STRIP = 0;

    /**
     * 心跳消息的消息数据体
     */
    public static final String PING = "ping";
    public static final String PONG = "pong";
}
